/* 
 * File:   RldRsp4000.cpp
 * Author: batista
 *
 * Created on 6 de Março de 2013, 20:32
 */

#include <cstdlib>
#include <iostream>
#include <stdio.h>
#include "src/ThreadRldEvent.h"
#include "src/ThreadMngEventRld.h"
#include "src/ThreadRFIDCard.h"
#include "src/ThreadMngRfidCard.h"
#include "src/ThreadStaffAssist.h"
#include "src/TimeUtil.h"
#include "src/DirFile.h"
#include "src/ShowMsg.h"

/*
 * 
 */
extern "C" int main(int argc, char** argv) {
    time_t now, later;
    
    //Lista para armazenas as Alas
    vector<Ward*> vec_allward;
    
    //Alas
    Ward *ward;
    
    //Processo de captura de Eventos Rauland
    ThreadRldEvent *thrld;
    
    //Gerenciador do processo de Captura 
    ThreadMngEventRld *thmngrld;
    
    //Processo de Captura RFID
    ThreadRFIDCard *thrfid;
    
    //Llista para Armazenas os Processos
    //Para as Alas
    vector<ThreadRFIDCard*> vec_thrfid;
    
    //Gerenciador dos Processos de Captura
    ThreadMngRfidCard *thmngrfid;
    
    //Processo de Limpeza dos Eventos em Aberto
    ThreadStaffAssist *thstaffas;
    //
    TimeUtil *tmut;
    //
    DirFile *dirfl;
    //
    ShowMsg *msg;
    msg = new ShowMsg();

    if (argc < 10) {
        msg->ShowMessage("Todos os paramentos precisam ser informados!!!", COLOR_BLUE, COLOR_PINK);
        exit(0);
    }

    dirfl = new DirFile();
    //

    time(&now);

    //Estancia o Processo de Captura
    thrld = new ThreadRldEvent();

    //Seta caminho para gravacao dos logs
    thrld->setDirfl(dirfl);

    //Seta porta serial de trabalho
    thrld->m_port->setSerial_port(std::string(argv[1]));

    //Seta baudrate
    thrld->m_port->setBaud_rate(std::string(argv[2]));

    //O caminho para gravacao dos logs
    dirfl->setSystem_path(std::string(argv[8])); //seta o caminho de gravacao
    //     

    //Cria estancia para DbConn
    DbConn *conn;

    //Stancia com inicializacao
    conn = new DbConn(dirfl, std::string(argv[3]), std::string(argv[4]), std::string(argv[5]), std::string(argv[6]), std::string(argv[7]));
    //

    //Estancia o Gerenciador da Rauland
    thmngrld = new ThreadMngEventRld();
    //
    //Seta caminho de gravacao dos logs
    thmngrld->setDirfl(dirfl);

    //Estancia o Processo para RFID
    thrfid = new ThreadRFIDCard();
    //
    thstaffas = new ThreadStaffAssist();
    //
    //Seta caminho de gravacao dos logs
    thstaffas->setDirfl(dirfl);

    //Pega todas as Alas
    vec_allward = conn->getAllWards();
    //
    ward = new Ward();
    //
    tmut = new TimeUtil();


    for (int i = 0; i < vec_allward.size(); i++) {
        ward = vec_allward.at(i);
        thrfid = new ThreadRFIDCard();
        //
        thrfid->SetDbconn(conn);
        //
        //Seta caminho de gravacao dos eventos
        thrfid->setDirfl(dirfl);
        //          
        thrfid->setWardIPPds(tmut->addStrCharToMessage(ward->GetWardPds().c_str()));
        //
        vec_thrfid.push_back(thrfid);
    }


    for (int i = 0; i < vec_thrfid.size(); i++) {
        thrfid = vec_thrfid.at(i);
        //Inicia o processo de captura
        start(thrfid);
        Thread::sleep(1000);
    }

    //
    thmngrfid = new ThreadMngRfidCard();
    //
    //Seta caminho de gravacao dos eventos
    thmngrfid->setDirfl(dirfl);

    //Seta o bando de dados local
    thmngrfid->setDbconn(conn);

    /**
     * Seta o banco de dados local
     * para o processo de captura
     */
    thrld->setDbcon(conn);

    /**
     * Seta o banco de dados local
     * para o processo gerenciador 
     * da Rauland.
     */
    thmngrld->SetDbconn(conn);

    //Seta a conexao do banco
    thstaffas->setDbconn(conn);

    //Calcula o tempo para espera
    long time_out = ((60 * (atoi(argv[9])))*1000);

    //Seta o tempo de espera
    thstaffas->setTimeoutAssist(time_out);

    //Inicia o processo de captura
    start(thrld);
    Thread::sleep(10);
    //
    //Inicia o processo de gerenciamento
    start(thmngrld);
    Thread::sleep(10);
    //
    start(thmngrfid);
    Thread::sleep(10);
    //
    start(thstaffas);
    Thread::sleep(10);
    //    
//    delete thrld;
    delete thrfid, thrld, thmngrld, thmngrfid, thstaffas;
    return 0;
}

